Xcode 11からアプリバージョンがstaticな値から環境変数を参照するようになっている
背景
Settings.bundleのRoot.plistにアプリのバージョンを書き出すことでiOSの「設定」アプリから対象のアプリのバージョンを確認できるようにしていました。 具体的にはBuild Phasesで以下のスクリプトを実行していました。
APP_VERSION=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $PRODUCT_SETTINGS_PATH) BUILD_NUMBER=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $PRODUCT_SETTINGS_PATH) /usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue ${APP_VERSION}(${BUILD_NUMBER})" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist"
Settings.bundleについてはこちらの記事をご覧ください。
Xcode 11でアプリのバージョンを変えたら意図しない表示に...
Xcodeのバージョンを11に上げ、リリースのためにTARGET > General > でいつものようにVersion
とBuild
を変更しました。
アプリをインストールしたところ、バージョン表記が以下のような意図しないものになってしまいました。 見覚えのない環境変数らしきものがそのまま出てしまっていますね。
何が変わったのか
Xcode 11になって何が変わったのでしょうか。
Version
とBuild
を変更した時のInfo.plist
の差分を見てみました。
バージョン変更前
バージョン変更後
Bundle versions string, short
(CFBundleShortVersionString))の値がstaticな値からMARKETING_VERSION
、
Bundle version
(CFBundleVersion)の値がstaticな値からCURRENT_PROJECT_VERSION
を参照するように変わっていました。
つまり、Xcode 11からそれぞれの環境変数を参照するようになりました。
TARGET > Build Settings > Versioningを確認すると設定したVersion
とBuild
の値が反映されていました。
スクリプトを修正
原因がわかったのでスクリプトを修正していきます。
MARKETING_VERSION
、CURRENT_PROJECT_VERSION
を参照するようにするだけです。
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue ${MARKETING_VERSION}(${CURRENT_PROJECT_VERSION})" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist"
スクリプト修正後の結果はこちらです。ちゃんと表示されました。
おわりに
ということでXcode 11でビルドしてみて少しハマったアプリのバージョンについて記事にしてみました。 Xcodeのバージョンを上げた場合はソースコードだけでなくこういった環境周りの変更も意識していきましょう(自戒
開発環境
- Xcode Version 11.3.1 (11C504)
- macOS Catalina Version 10.15.6